﻿using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;


namespace Csharpzuoye
{
    //属性作业
    //1.将之前User/Problem/HelpMoney类的字段封装成属性，其中：
    //1.）user.Password在类的外部只能改不能读
    //2.）如果user.Name为“admin”，输入时修改为“系统管理员”
    //3.）problem.Reward不能为负数
    //2.调用这些类的有参/无参构造函数，生成这些类的对象，调用他们的方法
    //4.设计一种方式，保证：
    //1)每一个Problem对象一定有Body赋值
    //2)每一个User对象一定有Name和Password赋值

    //继承作业
    //1.让User类无法被继承

    //枚举与位运算
    //3.User类中添加一个Tokens属性，类型为TokenManager

    //StringBuilder
    //2.设计一个适用的机制，能确保用户（User）的昵称（Name）不能含有admin、17bang、管理员等敏感词。 
    //3.确保用户（User）的密码（Password）：
    //长度不低于6
    //必须由大小写英语单词、数字和特殊符号（~!@#$%^&*()_+）组成

    [Table("Register")]
    [Index("CreateTime", IsUnique = true)]
    public class User : /*Entity, */ISendMessage, IChat  
        //用户登录页面：用户名（name）、密码(password)、验证码（code）
    {
        //3.User类中添加一个Tokens属性，类型为TokenManager

        //自定义配置作业
        //分别使用OnModelCreating()和Data Annotations，完成以下配置：
        //将之前的User类名改为Register，但仍然能对应表User
        //将之前的User属性Name改成UserName，但仍然能对应表User的列Name
        //将Name的长度限制为256
        //Password不能为空
        //将User表的主键设置在Id列上
        //User类中的属性FailedTry不用存储到数据库中
        //给CreateTime属性添加一个非聚集唯一索引
        //CreateTime不能小于2000年1月1日

        //关联对象作业
        //观察一起帮的功能，思考并
        //Email和User有一对一的关系，参照课堂演示，在数据库上建立User外键引用Email的映射
        //按继承映射：Problem/Article/Suggest以及他们的父类Content

        //事务  Helpmoney和User的关系
        //用事务实现帮帮币出售的过程
        //卖方帮帮币足够，扣减数额后成功提交。
        //卖方帮帮币不够，事务回滚，买卖双方帮帮币不变。
        
        public IList<HelpMoney> HelpMoneys { get; set; }
        public int MessageId { get; set; }
        public EmailMessage Message { get; set; }
        public int Id { get; set; }

        [Column("UserName")]
        [MaxLength(256)]
        //[Key]
        public string Name { get; set; }
        [Required]
        public string Password { get; set; }
        [NotMapped]
        public int FailedTry { get; set; }
        public DateTime CreateTime { get; set; }
        

        //public TokenManager Tokens { get; set; }
        //public List<Article> Articles { get; set; }
        //public List<Problem> Problems { get; set; }

        //private string _password;
        //private string _name;
        //private string _code;//所以验证码放在哪里？

        //1.）user.Password在类的外部只能改不能读
        //3.确保用户（User）的密码（Password）：
        //长度不低于6
        //必须由大小写英语单词、数字和特殊符号（~!@#$%^&*()_+）组成

        //public string Password
        //{
        //    set { _password = value; }
        //}
        //public static bool PasswordRule(string _password)
        //{
        //    string number = "1234567890";
        //    string character = "~!@#$%^&*()_+";
        //    string letter = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";

        //    if (_password.Length <= 6)
        //    {
        //        Console.WriteLine("密码长度不能低于6");
        //        return false;
        //    }
        //    else
        //    {
        //        for (int i = 0; i < number.Length - 1; i++)
        //        {
        //            if (_password.Contains(number[i]))
        //            {
        //                continue;
        //            }
        //            break;
        //        }
        //        for (int i = 0; i < character.Length - 1; i++)
        //        {
        //            if (_password.Contains(character[i]))
        //            {
        //                continue;
        //            }
        //            break;
        //        }
        //        for (int i = 0; i < letter.Length - 1; i++)
        //        {
        //            if (_password.Contains(letter[i]))
        //            {
        //                continue;
        //            }
        //            break;
        //        }
        //        return true;
        //    }
        //}

        //2.）如果user.Name为“admin”，输入时修改为“系统管理员” 
        //2.设计一个适用的机制，能确保用户（User）的昵称（Name）不能含有admin、17bang、管理员等敏感词。 
        //public string Name
        //{
        //    set
        //    {
        //        if (value.Contains("admin") || value.Contains("17bang") || value.Contains("管理员"))
        //        {
        //            Console.WriteLine("密码不能包含admin、17bang、管理员等敏感词");
        //            return;
        //        }
        //        _name = value;
        //    }
        //    get { return _name; }
        //}



        //2.调用这些类的有参/无参构造函数，生成这些类的对象，调用他们的方法
        //无参构造函数
        public User() : base()
        {

        }

        //4.设计一种方式，保证：
        // 每一个Problem对象一定有Body赋值
        //每一个User对象一定有Name和Password赋值

        //public User(string name, string password)
        //{
        //    _name = name;
        //    _password = password;
        //}


        void ISendMessage.Send()
        {

        }

        void IChat.Send()
        {

        }

      
    }
    //1.让User类无法被继承
    //   public sealed class User
    //{

    //}






}
